// 约瑟夫环
/* 
在罗马人占领乔塔帕特后，39 个犹太人与Josephus及他的朋友躲到一个洞中，39个犹太人决定宁愿死也不要被敌人抓。
于是决定了自杀方式，41个人排成一个圆圈，由第1个人开始报数，每报数到第3人该人就必须自杀。然后接着下一个重新报数，直到所有人都自杀身亡为止。
然而Josephus 和他的朋友并不想遵从，Josephus要他的朋友先假装遵从，他将朋友与自己安排在第16个与第31个位置，于是逃过了这场死亡游戏。 */
// n个人围成一圈，杀死第m个人，直到剩下s个人为止
// 输出存活的人的序号
const { CirSingleList } = require("../CirSingleList");
let myList = new CirSingleList();

function killPerson(n, m, s) {
  for (let i = 1; i <= n; i++) {
    myList.append(i);
  }

  let currNode = undefined;
  let toKill = null;

  while (myList.size > s) {
    // 直到剩下s个节点为止
    toKill = myList.advance(m, currNode); // 从currNode开始，前进m个节点
    currNode = toKill; // 保存要删除的节点作为下一次循环的参数
    myList.remove(toKill.element); // 删除第m个节点
  }

  myList.display();
}

killPerson(41, 3, 2); // head->16->31
// killPerson(5, 4, 1); // head->1
